iT邦幫忙

2024 iThome 鐵人賽

DAY 6
0
Security

密碼學小白的學習之路系列 第 6

[Day 6] 題目(Intro- 8、9)

  • 分享至 

  • xImage
  •  

Intro-8 XOR Properties

https://cryptohack.org/courses/intro/xor1/
https://ithelp.ithome.com.tw/upload/images/20240812/201681655AscAGxYdG.png

題意:

  • 介紹xor的性質

再來回顧一下xor的性質

  • Commutative (交換率)A ⊕ B = B ⊕ A
  • Associative (結合率)A ⊕ (B ⊕ C) = (A ⊕ B) ⊕ C
  • Identity (恆等律)A ⊕ 0 = A
  • Self-Inverse (自反律)A ⊕ A = 0
  • Double Application (雙重應用):如果將相同的數字進行兩次 XOR,會回到原始數值:(A ⊕ B) ⊕ B = A

解法:

利用xor的性質,解出flag

KEY1 = a6c8b6733c9b22de7bc0253266a3867df55acde8635e19c73313
KEY2 ^ KEY1 = 37dcb292030faa90d07eec17e3b1c6d8daf94c35d4c9191a5e1e
KEY2 ^ KEY3 = c1545756687e7573db23aa1c3452a098b71a7fbf0fddddde5fc1
FLAG ^ KEY1 ^ KEY3 ^ KEY2 = 04ee9855208a2cd59091d04767ae47963170d1660df7f56f5faf

程式碼:

from pwn import xor
#要記得將題目給的物件轉成bytes格式
k1 = bytes.fromhex('a6c8b6733c9b22de7bc0253266a3867df55acde8635e19c73313')
a1=bytes.fromhex('37dcb292030faa90d07eec17e3b1c6d8daf94c35d4c9191a5e1e')
a2=bytes.fromhex('c1545756687e7573db23aa1c3452a098b71a7fbf0fddddde5fc1')
a3=bytes.fromhex('04ee9855208a2cd59091d04767ae47963170d1660df7f56f5faf')
# a1 = k2^k1 = 37dcb292030faa90d07eec17e3b1c6d8daf94c35d4c9191a5e1e
# a2 = k2^k3 = c1545756687e7573db23aa1c3452a098b71a7fbf0fddddde5fc1
# a3 = Flag^k1^k3^k2 = 04ee9855208a2cd59091d04767ae47963170d1660df7f56f5faf

# k4=k1^k2^k3
k2= xor(k1,a1) # k1^(a1)= k1^(k1^k2)=(k1^k1)^k2 = k2
k3=xor(k2,a2)  # k2^(a2)=k2^(k2^k3)=(k2^k2)^k3 = k3
k4=xor(k3,a1)  # k3^(a1)=k3^(k1^k2)=k4
Flag=xor(k4,a3) # k4^(a3)=(k3^k1^k2)^(Flag^k1^k3^k2)=Flag
print(Flag)

crypto{x0r_i5_ass0c1at1v3}
也就是(crypto{xor_is_associative},xor是可交換的)

Intro-9 Favourite byte

https://cryptohack.org/courses/intro/xorkey0/
https://ithelp.ithome.com.tw/upload/images/20240812/20168165zLRhEpXK4V.png

題意:

  • 接下來要利用前面學到的東西,解xor題目。
  • 題目給了一串密文,是由flag與一未知位元組(bytes)進行xor運算後所得。

解法:

  • 先將密文轉成bytes形式,接著嘗試讓密文與密鑰的每個可能值(0 到 255)進行xor運算,直到找到解碼後的名問前六碼是crypto,就輸出這個flag。

程式碼與簡要註解:

from pwn import xor
k1=bytes.fromhex('73626960647f6b206821204f21254f7d694f7624662065622127234f726927756d')
for i in range(256):
    k2=xor(k1,i).decode() #decode:將bytes轉string
    if(k2[0:6]=='crypto'): #因為flag的形式是crypto{},所以若解碼後的前六碼為crypto,則輸出。
        print(k2)
        break   

crypto{0x10_15_my_f4v0ur173_by7e}
crypto{0x10_is_my_favourite_byte},以print(hex(i)) 檢查了一下,發現密鑰真的是0x10


參考資料:

  • 筆記

後話:

今天解了兩題xor題目。剩下的明天繼續解~


上一篇
[Day5] 題目(Intro- 6、7) & Xor 介紹 & Python第三方庫安裝
下一篇
[Day 7] 題目(Intro- 10)
系列文
密碼學小白的學習之路31
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言